package cn.xiaolang.thread.lock;

/**
 * 可重入锁使用示例
 *
 * @author fuhw/DeanKano
 * @date 2019-01-08
 */
public class MyReentrantLockApply {
	
	private MyReentrantLock lock = new MyReentrantLock();
	
	public void print() throws InterruptedException {
		lock.lock();
		doAdd();
		lock.unlock();
	}
	
	public void doAdd() throws InterruptedException {
		lock.lock();
		System.out.println(Thread.currentThread().getName()+" 执行doAdd方法 ");
		lock.unlock();
	}
	/**
	 * 我们设计两个线程调用print()方法，
	 * 第一个线程调用print()方法获取锁，进入lock()方法，由于初始lockedBy是null，所以不会进入while而挂起当前线程，
	 * 而是是增量lockedCount并记录lockBy为第一个线程。
	 * 接着第一个线程进入doAdd()方法，由于同一进程，所以不会进入while而挂起，接着增量lockedCount，
	 * 
	 * 当第二个线程尝试lock，由于isLocked=true,所以他不会获取该锁，
	 * 直到第一个线程调用两次unlock()将lockCount递减为0，才将标记为isLocked设置为false。
	 * 
	 * @throws InterruptedException
	 * @author fuhw/DeanKano
	 */
	public static void main(String[] args) {
		new Thread(()->{
			MyReentrantLockApply apply = new MyReentrantLockApply();
			try {
				apply.print();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}).start();
		new Thread(()->{
			MyReentrantLockApply apply = new MyReentrantLockApply();
			try {
				apply.print();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}).start();
	}
}
